package com.ls.fw.mvc.springmvc.util;

import java.net.URI;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.hateoas.Link;
import org.springframework.hateoas.PagedResources;
import org.springframework.hateoas.PagedResources.PageMetadata;
import org.springframework.hateoas.TemplateVariable;
import org.springframework.hateoas.TemplateVariable.VariableType;
import org.springframework.hateoas.TemplateVariables;
import org.springframework.hateoas.UriTemplate;
import org.springframework.hateoas.mvc.ControllerLinkBuilderFactory;

/*
 * 文 件 名:  RestUtil.java
 * 版    权:  kuanrf   Copyright YYYY-YYYY,  All rights reserved
 * 描    述:  <描述>
 * 修 改 人:  sheng.li
 * 修改时间:  2015年10月28日
 * 跟踪单号:  <跟踪单号>
 * 修改单号:  <修改单号>
 * 修改内容:  <修改内容>
 */

/**
 * Restful工具类
 * @author  sheng.li
 * @version  [版本号, 2015年10月28日]
 * @see  [相关类/方法]
 * @since  [产品/模块版本]
 */
public class RestUtil
{
    /**
     * 
     */
    public static final ControllerLinkBuilderFactory factory = new ControllerLinkBuilderFactory();
    
    
    /**
     * 分页查询资源
     * @param list
     * @param size
     * @param number
     * @param totalElements
     * @param totalPages
     * @param links
     * @return
     * @see [类、类#方法、类#成员]
     */
    public static <T> PagedResources<T> getPagedResources(List<T> list, long size
        , long number, long totalElements, long totalPages, Link... links){
        
        PageMetadata metadata = new PagedResources.PageMetadata(size, number, totalElements, totalPages);
        PagedResources<T> resources;
        resources = new PagedResources<T>(list, metadata, links);
        return resources;
    }
    
    
    /**
     * 分页查询资源
     * @param list
     * @param size
     * @param number
     * @param totalElements
     * @param links
     * @return
     * @see [类、类#方法、类#成员]
     */
    public static <T> PagedResources<T> getPagedResources(List<T> list, long size
        , long number, long totalElements, Link... links){
        
        PageMetadata metadata = new PagedResources.PageMetadata(size, number, totalElements);
        PagedResources<T> resources;
        resources = new PagedResources<T>(list, metadata, links);
        return resources;
    }
    
   /**
    * 生成uri模板
    * @param template 例子："/foo/{foo1}{/d}{?bar,foobar}{#anchor}"
    * @return
    * @see [类、类#方法、类#成员]
    */
    public static UriTemplate getUriTemplate(String template){
        return new UriTemplate(template);
    }

    /**
     * 生成uri模板
     * @param baseUri  例子：/foo
     * @param variables
     * @return
     * @see [类、类#方法、类#成员]
     */
    public static UriTemplate getUriTemplate(String baseUri, TemplateVariables variables){
        return new UriTemplate(baseUri, variables);
    }

    
    /**
     * 生成uri模板
     * @param baseUri 例子：/foo
     * @param variables
     * @return
     * @see [类、类#方法、类#成员]
     */
    public static UriTemplate getUriTemplate(String baseUri, TemplateVariable... variables){
        TemplateVariables variables1 = new TemplateVariables(variables);
        return new UriTemplate(baseUri, variables1);
    }

    
    /**
     * 生成uri
     * @param template 例子："/foo/{foo1}{/d}{?bar,foobar}{#anchor}"
     * @param parameters
     * @return
     * @see [类、类#方法、类#成员]
     */
    public static URI getUri(String template, Map<String, Object> parameters){
        return new UriTemplate(template).expand(parameters);
    }
    
    
    /**
     * 生成uri
     * @param template 例子："/foo/{foo1}{/d}{?bar,foobar}{#anchor}"
     * @param parameters
     * @return
     * @see [类、类#方法、类#成员]
     */
    public static URI getUri(String template, Object... parameters){
        return new UriTemplate(template).expand(parameters);
    }
    

    
    public static void main(String[] args)
    {
        System.out.println(RestUtil.getPagedResources( Collections.emptyList(), 10, 1, 200));
        UriTemplate u = RestUtil.getUriTemplate("/foo",new TemplateVariable("bar", VariableType.REQUEST_PARAM), new TemplateVariable("fooBar",
            VariableType.REQUEST_PARAM));        
        System.out.println(u);
        Map<String, Object> parameters = new HashMap<String, Object>();
        parameters.put("bar", "myBar");
        parameters.put("fooBar", "myFooBar");
        URI uri =  RestUtil.getUri(u.toString(), parameters);
        System.out.println(uri);
    }
    
}
